/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package CONTROLES;

import MODELOS.Cliente;
import MODELOS.Cuenta;
import MODELOS.ListaPagos;
import MODELOS.Pago;
import MODELOS.PlanInversion;
import MODELOS.Recibo;
import UTILITARIOS.EncriptarCadena;
import UTILITARIOS.Fecha;
import UTILITARIOS.StringToDate;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author VICENTE
 */
public class ControlPago {

    public ControlPago(){

    }

 public ArrayList<ListaPagos> getPagosDisponiblesBanco(int idSucursal, Date fechaI, Date fechaF){
        Conexion conection = new Conexion();
        ArrayList<ListaPagos> pagos = new ArrayList<ListaPagos>();
        ListaPagos l;
        Pago c;
        Cuenta cu;
        Cliente cli;
        PlanInversion plan;
        try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select p.*, c.numero_cuenta, c.modo_pago, c.monto, c.codigo_cuenta, plan.nombre,plan.frecuencia_pago, cli.nombre_cliente, cli.apellido_cli, cli.telefono, cli.celular, cli.banco, cli.cuenta from PAGOS as p, CUENTA as c, PLAN_INVERSION as plan, CLIENTE as cli where p.fecha_pago >= '"+fechaI+"' AND p.fecha_pago <= '"+fechaF+"' AND c.id_cuenta = p.id_cuenta AND c.id_sucursal = '"+idSucursal+"' AND c.modo_pago = 'DEPOSITO BANCARIO' AND ( p.estado = 'PENDIENTE' OR p.estado = 'REZAGADO') AND plan.id_plan = c.id_plan AND cli.id_cliente = c.id_cliente ORDER BY cli.banco ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){
                l = new ListaPagos();
                c= new Pago();
                cu = new Cuenta();
                cli = new Cliente();
                plan = new PlanInversion();

                c.setIdPago(respEmp.getInt(1));
                c.setFechaPago(respEmp.getDate(2));
                c.setMonto(respEmp.getDouble(3));
                c.setIdCuenta(respEmp.getInt(4));
                c.setIdUsuario(respEmp.getInt(5));
                c.setIdSucursal(respEmp.getInt(6));
                c.setEstado(respEmp.getString(7));
                c.setNumeroPago(respEmp.getInt(8));
                c.setIdRecibo(respEmp.getInt(9));
                c.setModoPago(respEmp.getString(10));
                l.setPago(c);
                cu.setNumeroCuenta(respEmp.getLong(11));
                cu.setModoPago(respEmp.getString(12));
                cu.setMonto(respEmp.getDouble(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                cu.setCodigoCuenta(Double.valueOf(cod));
                l.setCuenta(cu);
                plan.setNombrePlan(respEmp.getString(15));
                plan.setFrecuenciaPago(respEmp.getInt(16));
                l.setPlan(plan);
                cli.setNombreCliente(respEmp.getString(17));
                cli.setApellidosCli(respEmp.getString(18));
                cli.setTelefono(respEmp.getInt(19));
                cli.setCelular(respEmp.getInt(20));
                cli.setBanco(respEmp.getString(21));
                cli.setCuenta(respEmp.getLong(22));
                l.setCliente(cli);

                pagos.add(l);
            }
        }catch (SQLException e){
            System.out.println("error al recuperar lista de Pagos Disponibles para en Banco" + e.getLocalizedMessage());
        }
        return pagos;
    }

    public ArrayList<ListaPagos> getPagosDisponibles(int idSucursal, Date fechaI, Date fechaF) {
        Conexion conection = new Conexion();
        ArrayList<ListaPagos> pagos = new ArrayList<ListaPagos>();
        ListaPagos l;
        Pago c;
        Cuenta cu;
        Cliente cli;
        PlanInversion plan;
        try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select p.*, c.numero_cuenta, c.modo_pago, c.monto, c.codigo_cuenta, plan.nombre,plan.frecuencia_pago, cli.nombre_cliente, cli.apellido_cli, cli.telefono, cli.celular from PAGOS as p, CUENTA as c, PLAN_INVERSION as plan, CLIENTE as cli where  p.fecha_pago >= '"+fechaI+"' AND p.fecha_pago <= '"+fechaF+"' AND c.id_cuenta = p.id_cuenta AND c.id_sucursal = '"+idSucursal+"' AND ( p.estado = 'PENDIENTE' OR p.estado = 'REZAGADO') AND plan.id_plan = c.id_plan AND cli.id_cliente = c.id_cliente ORDER BY p.id_recibo ASC");
//            PreparedStatement psc = conectado.prepareStatement("select p.*, c.* from PAGOS as p, CUENTA as c where p.fecha_pago >= '"+fechaI+"' AND p.fecha_pago < '"+fechaF+"' AND c.id_cuenta = p.id_cuenta AND c.id_sucursal = '"+idSucursal+"' AND ( p.estado = 'PENDIENTE' OR p.estado = 'REZAGADO') ORDER BY p.fecha_pago ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){
                l = new ListaPagos();
                c= new Pago();
                cu = new Cuenta();
                cli = new Cliente();
                plan = new PlanInversion();

                c.setIdPago(respEmp.getInt(1));
                c.setFechaPago(respEmp.getDate(2));
                c.setMonto(respEmp.getDouble(3));
                c.setIdCuenta(respEmp.getInt(4));
                c.setIdUsuario(respEmp.getInt(5));
                c.setIdSucursal(respEmp.getInt(6));
                c.setEstado(respEmp.getString(7));
                c.setNumeroPago(respEmp.getInt(8));
                c.setIdRecibo(respEmp.getInt(9));
                c.setModoPago(respEmp.getString(10));
                l.setPago(c);
                cu.setNumeroCuenta(respEmp.getLong(11));
                cu.setModoPago(respEmp.getString(12));
                cu.setMonto(respEmp.getDouble(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                cu.setCodigoCuenta(Double.valueOf(cod));
                l.setCuenta(cu);
                plan.setNombrePlan(respEmp.getString(15));
                plan.setFrecuenciaPago(respEmp.getInt(16));
                l.setPlan(plan);
                cli.setNombreCliente(respEmp.getString(17));
                cli.setApellidosCli(respEmp.getString(18));
                cli.setTelefono(respEmp.getInt(19));
                cli.setCelular(respEmp.getInt(20));
                l.setCliente(cli);

                pagos.add(l);
            }
        }catch (SQLException e){
            System.out.println("error al recuperar lista de Pagos Disponibles " + e.getLocalizedMessage());
        }
        return pagos;
    }

    public ArrayList<ListaPagos> getPagosPorRezagar(int idSucursal, Date fechaActual) {

        Calendar f = Calendar.getInstance();
        f.setTime(fechaActual);
        f.add(Calendar.DATE, -2);
        
        Conexion conection = new Conexion();
        ArrayList<ListaPagos> pagos = new ArrayList<ListaPagos>();
        ListaPagos l;
        Pago c;
        Cuenta cu;
        Cliente cli;
        PlanInversion plan;
        try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select p.*, c.numero_cuenta, c.modo_pago, c.monto, c.codigo_cuenta, plan.nombre,plan.frecuencia_pago, cli.nombre_cliente, cli.apellido_cli, cli.telefono, cli.celular, c.fecha_cierre from PAGOS as p, CUENTA as c, PLAN_INVERSION as plan, CLIENTE as cli where p.fecha_pago < '"+f.getTime()+"' AND c.id_cuenta = p.id_cuenta AND c.id_sucursal = '"+idSucursal+"' AND c.modo_pago = 'DIRECTO' AND c.estado='ACTIVA' AND ( p.estado = 'PENDIENTE' OR p.estado = 'REZAGADO') AND plan.id_plan = c.id_plan AND cli.id_cliente = c.id_cliente ORDER BY p.fecha_pago ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){
                l = new ListaPagos();
                c= new Pago();
                cu = new Cuenta();
                cli = new Cliente();
                plan = new PlanInversion();

                c.setIdPago(respEmp.getInt(1));
                c.setFechaPago(respEmp.getDate(2));
                c.setMonto(respEmp.getDouble(3));
                c.setIdCuenta(respEmp.getInt(4));
                c.setIdUsuario(respEmp.getInt(5));
                c.setIdSucursal(respEmp.getInt(6));
                c.setEstado(respEmp.getString(7));
                c.setNumeroPago(respEmp.getInt(8));
                c.setIdRecibo(respEmp.getInt(9));
                c.setModoPago(respEmp.getString(10));
                l.setPago(c);
                cu.setNumeroCuenta(respEmp.getLong(11));
                cu.setModoPago(respEmp.getString(12));
                cu.setMonto(respEmp.getDouble(13));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(14), false);
                cu.setCodigoCuenta(Double.valueOf(cod));                
                plan.setNombrePlan(respEmp.getString(15));
                plan.setFrecuenciaPago(respEmp.getInt(16));
                l.setPlan(plan);
                cli.setNombreCliente(respEmp.getString(17));
                cli.setApellidosCli(respEmp.getString(18));
                cli.setTelefono(respEmp.getInt(19));
                cli.setCelular(respEmp.getInt(20));
                l.setCliente(cli);
                cu.setFechaFechaCierre(respEmp.getDate(21));
                l.setCuenta(cu);
                if(l.getCuenta().getFechaCierre().getTime()> fechaActual.getTime())
                    pagos.add(l);
            }
        }catch (SQLException e){
            System.out.println("error al recuperar lista de Pagos disponibles Para rezagar " + e.getLocalizedMessage());
        }
        return pagos;
    }

    public boolean rezagarPagos(ArrayList<ListaPagos> listPagos) {
        Conexion conection = new Conexion();
        Calendar fecha = Calendar.getInstance();
        Pago p = new Pago();
        try{
            Connection conectado = conection.getConexion();            
            for(int i = 0; i<listPagos.size();i++){                
                p = listPagos.get(i).getPago();
                fecha.setTime(p.getFechaPago());
                fecha.add(Calendar.MONTH, 1);
                PreparedStatement psc = conectado.prepareStatement("UPDATE pagos SET estado='REZAGADO', fecha_pago ='"+fecha.getTime()+"' WHERE id_pago = '"+p.getIdPago()+"';");
                psc.executeUpdate();
                psc.close();
            }
        }catch (SQLException e){
            System.out.println("Error al Rezagar el pago con el id="+p.getIdPago()+" debido a: " + e.getLocalizedMessage());
            return false;
        }
        return true;
    }

    public ArrayList<ListaPagos> getPagosPagados(int idSucursal, Date fechaI, Date fechaF, int user) {
        Conexion conection = new Conexion();
        ArrayList<ListaPagos> pagos = new ArrayList<ListaPagos>();
        ListaPagos l;
        Pago c;
        Recibo r;
        Cuenta cu;
        Cliente cli;
        PlanInversion plan;
        try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("select p.*, r.tipo_cambio , c.numero_cuenta, c.modo_pago, c.monto, c.codigo_cuenta, plan.nombre,plan.frecuencia_pago, cli.nombre_cliente, cli.apellido_cli, cli.telefono, cli.celular from PAGOS as p, CUENTA as c, PLAN_INVERSION as plan, RECIBO as r, CLIENTE as cli where  r.fecha >= '"+fechaI+"' AND r.fecha <= '"+fechaF+"' AND c.id_cuenta = p.id_cuenta AND c.id_sucursal = '"+idSucursal+"' AND c.id_usuario = '"+user+"' AND plan.id_plan = c.id_plan AND p.id_recibo = r.id_recibo AND cli.id_cliente = c.id_cliente ORDER BY p.id_recibo ASC");
            ResultSet respEmp = psc.executeQuery();
            while (respEmp.next()){
                l = new ListaPagos();
                c= new Pago();
                r= new Recibo();
                cu = new Cuenta();
                cli = new Cliente();
                plan = new PlanInversion();

                c.setIdPago(respEmp.getInt(1));
                c.setFechaPago(respEmp.getDate(2));
                c.setMonto(respEmp.getDouble(3));
                c.setIdCuenta(respEmp.getInt(4));
                c.setIdUsuario(respEmp.getInt(5));
                c.setIdSucursal(respEmp.getInt(6));
                c.setEstado(respEmp.getString(7));
                c.setNumeroPago(respEmp.getInt(8));
                c.setIdRecibo(respEmp.getInt(9));
                c.setModoPago(respEmp.getString(10));
                l.setPago(c);
                r.setTipoCambio(respEmp.getDouble(11));
                l.setRecibo(r);
                cu.setNumeroCuenta(respEmp.getLong(12));
                cu.setModoPago(respEmp.getString(13));
                cu.setMonto(respEmp.getDouble(14));
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(15), false);
                cu.setCodigoCuenta(Double.valueOf(cod));
                l.setCuenta(cu);
                plan.setNombrePlan(respEmp.getString(16));
                plan.setFrecuenciaPago(respEmp.getInt(17));
                l.setPlan(plan);
                cli.setNombreCliente(respEmp.getString(18));
                cli.setApellidosCli(respEmp.getString(19));
                cli.setTelefono(respEmp.getInt(20));
                cli.setCelular(respEmp.getInt(21));
                l.setCliente(cli);
                
                pagos.add(l);
            }
        }catch (SQLException e){
            System.out.println("error al recuperar lista de Intereses pagados " + e.getLocalizedMessage());
        }
        return pagos;
    }

    public double getTotalPagosPagados(int idSucursal, Date fecha){
       Conexion conection = new Conexion();
       double total = 0.0;
       int i =1;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("SELECT c.monto, c.codigo_cuenta, pl.frecuencia_pago, r.tipo_cambio  FROM plan_inversion as pl, cuenta as c, recibo as r, pagos as p WHERE r.fecha = '"+fecha+"' AND r.id_sucursal = '"+idSucursal+"' AND p.id_recibo = r.id_recibo AND p.id_cuenta = c.id_cuenta AND pl.id_plan = c.id_plan ");
            ResultSet respEmp = psc.executeQuery();
            double monto;
            double porcentaje;
            int frecuencia;
            double tipo_cambio;
            while(respEmp.next()){
                System.out.println(i);
                i++;
                monto = respEmp.getDouble(1);
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(2), false);
                porcentaje = Double.valueOf(cod)/100;
                frecuencia = respEmp.getInt(3);
                tipo_cambio = respEmp.getInt(4);
                total = total + ((monto * porcentaje)*frecuencia * tipo_cambio);
           }
        }catch (SQLException e){
            System.out.println("error al recuperar el total de los Recibos del dia " + e.getLocalizedMessage());
        }
        return total;
    }

    public double getTotalPagosAnulados(int idSucursal, Date fecha){
       Conexion conection = new Conexion();
       double total = 0.0;
       try{
            Connection conectado = conection.getConexion();
            PreparedStatement psc = conectado.prepareStatement("SELECT cuenta.monto, cuenta.codigo_cuenta, plan_inversion.frecuencia_pago FROM pagos, cuenta, plan_inversion WHERE pagos.fecha_pago = '"+fecha+"' AND pagos.id_sucursal = '"+idSucursal+"' AND pagos.estado = 'ANULADO' AND cuenta.id_cuenta = pagos.id_cuenta AND plan_inversion.id_plan = cuenta.id_plan ");
            ResultSet respEmp = psc.executeQuery();
            double monto;
            double porcentaje;
            int frecuencia;
            while(respEmp.next()){
                monto = respEmp.getDouble(1);
                String cod = new EncriptarCadena().Encriptar("nfn inversiones", respEmp.getString(2), false);
                porcentaje = Double.valueOf(cod)/100;
                frecuencia = respEmp.getInt(3);
                total = total + ((monto * porcentaje)*frecuencia);
           }
        }catch (SQLException e){
            System.out.println("Error al recuperar el total de los Intereses Anulados del dia " + e.getLocalizedMessage());
        }
        return total;
    }
}